package 网络编程2套接字;
//网络编程,通过代码来控制让两个主机之间的进程能够进行数据交互
//例如:我使用qq发送一个消息,这个消息就是通过我电脑上的qq客户端进程,行先发送给了腾讯的服务器(对应的服务器进程)
//再由腾讯的服务器进程,把这个消息转发给对方电脑的qq进程

//操作系统就把网络编程的一些相关操作,封装起来了,提供了一组API供程序员来调用.(socket(套接字)API,英文愿意为:插槽)
//操作系统提供的功能:访问网络核心的硬件设备,网卡.网卡也是归操作系统来管理

//操作系统提供的socket api是C语言风格的接口,咱们在Java中是不能直接使用的.
//JDK其实也针对C语言这里的socket API进行了封装.
//在标准库中有一组类,这组类就能够让我们完成网络编程.
//这组类本质上仍然是调用的操作系统提供的socket API

//跨语言调用,不同的语言之间,很多都可以互相调用.
//要想能够跨语言调用,核心原理在于,了解对应的语言的ABI(二进制编程接口)

/**
 * 操作系统,提供的socket API主要有两类(实际上不知两类,还有其他的)
 * 1.流套接字(底层使用TCP协议)
 * 2.数据报套接字(底层使用了UDP协议)
 * 简单介绍TCP,UDP
 * 都是传输层协议~
 * socket API也是属于传输层的东西
 *
 * 应用层                 应用程序
 * -----------------------
 * 传输层                 操作系统+硬件
 * 网络层
 * 物理链路层
 * 物理层
 *
 * 咱们是在应用程序中,使用socket API
 * socket API也都是传输层协议暴露给上面的应用层的(离得近)
 *
 * TCP:
 * 1.有连接
 * 2.可靠传输
 * 3.面向字节流
 * 4.全双工
 *
 * UDP:
 * 1.无连接
 * 2.不可靠传输
 * 3.面向数据报
 * 4.全双工
 *
 * 1.
 * 有链接:打电话
 * 无连接:发微信
 * 2.
 * 可靠传输:发送方能够知道对方是不是收到了
 * 不可靠传输:发送方不知道对方是不是收到了
 * 所谓的可靠传输,不是说发送的数据100%就能被对方收到(不可能)
 * 3.
 * 面向字节流:为了发送100个字节,可以一次发1个字节,重复100次,也可以一次发10个字节,重复10次..
 *          可以非常灵活的完成这里的发送,接受也是同理.
 * 面向数据报:以一个一个的数据报为基本单位.(每个数据报多大,不同的协议里面是有不同的约定的)
 *          发送的时候,一次至少发一个数据报.(如果尝试发一个半,实际只能发出去一个)
 *          发送的时候,一次至少收一个数据报.(如果尝试收半个,剩下半个就没了)
 *
 * TCP是面向字节流的.
 * 文件读写,也是面向字节流的.
 * 后面去编写TCP的代码的时候,InputStream,OutputStream也会登场
 * 4.
 * 全双工:双向通行.A和B可以同时向对方发送接收数据.
 * 半双工:单向通信,要么A给B发,要么是B给A发,不能同时发.
 */
public class TestDemo2 {
}
